From 61fee121d9cf1c220cab7cdf7e0d95c30af36a18 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Mon, 3 Mar 2008 15:19:39 +0000 Subject: [PATCH] hvm emulate: Correctly probe when we are in 64-bit mode and set address-size default appropriately. Signed-off-by: Keir Fraser --- xen/arch/x86/hvm/emulate.c | 21 +++++++++++++++------ xen/arch/x86/mm/shadow/common.c | 4 ---- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/xen/arch/x86/hvm/emulate.c b/xen/arch/x86/hvm/emulate.c index 7ba9b703de..9c1a2daeb6 100644 --- a/xen/arch/x86/hvm/emulate.c +++ b/xen/arch/x86/hvm/emulate.c @@ -673,14 +673,23 @@ int hvm_emulate_one( struct hvm_emulate_ctxt *hvmemul_ctxt) { struct cpu_user_regs *regs = hvmemul_ctxt->ctxt.regs; + struct vcpu *curr = current; uint32_t new_intr_shadow; unsigned long addr; int rc; - hvmemul_ctxt->ctxt.addr_size = - hvmemul_ctxt->seg_reg[x86_seg_cs].attr.fields.db ? 32 : 16; - hvmemul_ctxt->ctxt.sp_size = - hvmemul_ctxt->seg_reg[x86_seg_ss].attr.fields.db ? 32 : 16; + if ( hvm_long_mode_enabled(curr) && + hvmemul_ctxt->seg_reg[x86_seg_cs].attr.fields.l ) + { + hvmemul_ctxt->ctxt.addr_size = hvmemul_ctxt->ctxt.sp_size = 64; + } + else + { + hvmemul_ctxt->ctxt.addr_size = + hvmemul_ctxt->seg_reg[x86_seg_cs].attr.fields.db ? 32 : 16; + hvmemul_ctxt->ctxt.sp_size = + hvmemul_ctxt->seg_reg[x86_seg_ss].attr.fields.db ? 32 : 16; + } hvmemul_ctxt->insn_buf_eip = regs->eip; hvmemul_ctxt->insn_buf_bytes = @@ -715,11 +724,11 @@ int hvm_emulate_one( if ( hvmemul_ctxt->intr_shadow != new_intr_shadow ) { hvmemul_ctxt->intr_shadow = new_intr_shadow; - hvm_funcs.set_interrupt_shadow(current, new_intr_shadow); + hvm_funcs.set_interrupt_shadow(curr, new_intr_shadow); } if ( hvmemul_ctxt->ctxt.retire.flags.hlt && - !hvm_local_events_need_delivery(current) ) + !hvm_local_events_need_delivery(curr) ) { hvm_hlt(regs->eflags); } diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c index 240d9100f0..fdb1d0e4aa 100644 --- a/xen/arch/x86/mm/shadow/common.c +++ b/xen/arch/x86/mm/shadow/common.c @@ -402,10 +402,6 @@ struct x86_emulate_ops *shadow_init_emulation( { sh_ctxt->ctxt.addr_size = sh_ctxt->ctxt.sp_size = 64; } - else if ( regs->eflags & X86_EFLAGS_VM ) - { - sh_ctxt->ctxt.addr_size = sh_ctxt->ctxt.sp_size = 16; - } else { sreg = hvm_get_seg_reg(x86_seg_ss, sh_ctxt); -- 2.30.2